﻿using System;
using System.Web;
using Microsoft.SharePoint;

namespace Examples.CAMLFilter
{
    /// <summary>
    /// Class contains some static methodes for locale manipulations
    /// </summary>
    public class Locales
    {

        #region Language-related methods

        /// <summary>
        /// Collection of supported locales
        /// </summary>
        public enum Language : uint
        {
            None = uint.MinValue,
            Eng = 1033,
            Rus = 1049,
            All = uint.MaxValue
        }

        /// <summary>
        /// Array of all available languages
        /// </summary>
        public static Language[] Languages = { Language.Eng, Language.Rus };

        /// <summary>
        /// Returns current language from environment
        /// If it cannot be determinated, returns English
        /// </summary>
        /// <returns>Language value</returns>
        public static Language GetCurrentLanguage()
        {
            return GetCurrentLanguage(null);
        }

        public static Language GetLanguage(object obj)
        {
            uint i;

            if (obj is int)
                i = (uint)(int)obj;
            else if (obj is String)
                i = uint.Parse((String)obj);
            else if (obj is uint)
                i = (uint)obj;
            else if (obj is SPWeb)
                i = ((SPWeb)obj).Language;
            else
                throw new Exception("Value is not Language");

            if (Enum.IsDefined(typeof(Language), i))
                return (Language)i;
            else
                throw new Exception("Value is not Language");
        }


        public static Language GetCurrentLanguage(uint? webLanguage)
        {
            // По дефолту - английский
            int langID = (int)Language.Eng;

            // Смотрим, в рамках какого контекста нас вызвали
            // Сначала HTTP - вдруг что в запросе прилетело
            if (HttpContext.Current != null)
            {
                // Приоритет - у GET
                if (!Int32.TryParse(HttpContext.Current.Request.QueryString.Get("lcid"), out langID))
                    // Затем - у куки
                    if (HttpContext.Current.Request.Cookies.Get("lcid") == null || !Int32.TryParse(HttpContext.Current.Request.Cookies.Get("lcid").Value, out langID))
                        // На крайняк - у сессии
                        langID = HttpContext.Current.Session != null ? HttpContext.Current.Session.LCID : (int)Language.Eng;
            }
            // Иначе - вдруг webLanguage передали
            else if (webLanguage != null)
            {
                langID = (int)webLanguage;
            }
            // Иначе - что у нас в SPContext-е
            else if (SPContext.Current != null)
            {
                langID = (int)SPContext.Current.Web.Language;
            }

            return ((langID == (int)Language.Rus) ? Language.Rus : Language.Eng);

        }

        #endregion

    }

    /// <summary>
    /// Класс для получения и хранения текущей локали внутри компонентов 
    /// </summary>
    public class Locale
    {
        public Locales.Language Lang
        {
            get
            {
                if (_lang == Locales.Language.None)
                    _lang = Locales.GetCurrentLanguage();
                return _lang;
            }
        }
        private Locales.Language _lang = Locales.Language.None;


        /// <summary>
        /// Неявное преобразование Locale к uint для использования в стандартной SPUtility.GetLocalizedString
        /// </summary>
        /// <param name="locale">Объект типа Locale</param>
        /// <returns>uint-значение выбранного языка</returns>
        public static implicit operator uint(Locale locale) { return (uint)locale.Lang; }

        /// <summary>
        /// Неявное преобразование Locale к int
        /// </summary>
        /// <param name="locale">Объект типа Locale</param>
        /// <returns>int-значение выбранного языка</returns>
        public static implicit operator int(Locale locale) { return (int)locale.Lang; }


        /// <summary>
        /// Неявное преобразование Locale к Locale.Language
        /// </summary>
        /// <param name="locale">Объект типа Locale</param>
        /// <returns>Language-значение выбранного языка</returns>
        public static implicit operator Locales.Language(Locale locale) { return locale.Lang; }

    }



}
